// entry-server.js
import { createApp } from './main'
const log4js = require('log4js')
log4js.configure('./config/log4js.json')
const log = log4js.getLogger('console')

export default context => {
  // 因为有可能会是异步路由钩子函数或组件，所以我们将返回一个 Promise，
  // 以便服务器能够等待所有的内容在渲染前，
  // 就已经准备就绪。
  return new Promise((resolve, reject) => {
    console.log('------entry-server.js -context--new Promise--------------')
    const { app, router, store } = createApp()
    // 设置服务器端 router 的位置 更改路由
    router.push(context.url)
    console.log('--------进入router.onReady()之前--------------')
    // 等到 router 将可能的异步组件和钩子函数解析完
    router.onReady(() => {
      console.log('--------进入router.onReady(() =>--------------')
      // 获取相应路由下的组件
      const matchedComponents = router.getMatchedComponents()
      // 匹配不到的路由，执行 reject 函数，并返回 404
      if (!matchedComponents.length) {
        // eslint-disable-next-line
        return reject({ code: 404 })
      }
      console.log('--------进入Promise.all之前--------------')
      // 遍历路由下所以的组件，如果有需要服务端渲染的请求，则进行请求
      Promise.all(matchedComponents.map(component => {
        console.log('------- Promise.all if 之前--------------')
        if (component.serverRequest) {
          console.log('------- Promise.all if 之中--------------')
          return component.serverRequest(store)
        }
        console.log('------- Promise.all if 之后--------------')
      })).then(() => {
        console.log('--------context.state 赋值之前--------------')
        // console.log('store.state:'+JSON.stringiyf(store.state))
        // context.state = JSON.stringify(store.state)
        context.state = store.state
        context.title = store.state.homeInfo
        console.log('entry-server:38  context.state:' + JSON.stringify(context.state))
        console.log('entry-server:38  context.state.homeInfo:' + JSON.stringify(context.state.homeInfo))
        console.log('--------context.state 赋值之后--------------')
        // Promise 应该 resolve 应用程序实例，以便它可以渲染
        // resolve(app)
        log.info('entry-server.js log.info:resolve(app)：\n' + resolve(app))
        console.log('--resolve(app) 之后------------')
      }).catch(reject)
    }, reject)
    console.log('--------router.onReady()结束--------------')
  })
}
